#include <iostream>
#include <cstring>
using namespace std;

/*
	引入多态：
	    面向对象三大思想：类封装，继承和派生，多态
	请你封装一个函数，要求该函数可以展示各种动物吃什么？
	
*/
class Animal
{
public:
	void eat()
	{
		cout<<"动物吃"<<endl;
	}
};

class Cat:public Animal
{
public:
	void eat()
	{
		cout<<"猫吃🐟"<<endl;
	}
};

class Dog:public Animal
{
public:
	void eat()
	{
		cout<<"🐕吃骨头"<<endl;
	}	
};

class Sheep:public Animal
{
public:
	void eat()
	{
		cout<<"🐏吃草"<<endl;
	}	
};

//请你封装一个函数，要求该函数可以展示各种动物吃什么？
/*
	思考1：需要参数，参数要具有通用性(可以兼容所有的动物)
	答案：C++规定，有了继承之后，父类的指针或者父类的引用可以直接指向不同的子类对象(不需要使用任何强转类型转换)
	      父类 *p=&子类
		  父类 &b=子类
	思考2：我们希望传递不同的子类对象，可以调用不同子类里面的同名eat方法
	答案：必须使用虚函数才能解决，此时无法解决
*/
//void showAnimalEat(Animal &other) //参数天下无敌，只要是Animal的子类都可以兼容
void showAnimalEat(Animal *other)   //参数天下无敌，只要是Animal的子类都可以兼容 
{
	//调用各个动物里面的eat方法
	other->eat();
}

int main(int argc,char **argv)
{
	//定义各种动物对象
	Cat c1;
	Dog d1;
	Sheep s1;
	
	//showAnimalEat(c1);
	//showAnimalEat(d1);
	//showAnimalEat(s1);
	
	showAnimalEat(&c1);
	showAnimalEat(&d1);
	showAnimalEat(&s1);
	return 0;	
}